home *** CD-ROM | disk | FTP | other *** search
- /********************************************************/
- /* */
- /* MDEF Code from Chapter Three of */
- /* */
- /* The Macintosh Programming Primer, Volume II, */
- /* Second Edition */
- /* */
- /* Copyright 1993, Dave Mark */
- /* */
- /* This program demonstrates specific Mac programming */
- /* techniques. */
- /* */
- /********************************************************/
-
-
- #define kTopMargin 1
- #define kLeftMargin 2
-
-
- void DoSizeMessage( MenuHandle menu, Rect *menuRectPtr );
- void DoDrawMessage( MenuHandle menu, Rect *menuRectPtr );
- void DoChooseMessage( MenuHandle menu, Rect *menuRectPtr,
- Point hitPt, short *whichItemPtr );
- void InvertItem( short itemNumber, short itemHeight, Rect *menuRectPtr );
- void DrawCenteredPict( PicHandle pic, Rect *rectPtr );
- void CalcitemHeightAndWidth( short basePICTid, short numPICTs,
- short *widthPtr, short *heightPtr );
- void GetNumPICTs( MenuHandle menu, short *baseIDPtr,
- short *numPICTsPtr );
-
-
- /*********************************** main */
-
- pascal void main( short message,
- MenuHandle menu,
- Rect *menuRectPtr,
- Point hitPt,
- short *whichItemPtr )
- {
- switch( message )
- {
- case mDrawMsg:
- DoDrawMessage( menu, menuRectPtr );
- break;
- case mChooseMsg:
- DoChooseMessage( menu, menuRectPtr, hitPt, whichItemPtr );
- break;
- case mSizeMsg:
- DoSizeMessage( menu, menuRectPtr );
- break;
- }
- }
-
-
- /*********************************** DoSizeMessage */
-
- void DoSizeMessage( MenuHandle menu,
- Rect *menuRectPtr )
- {
- short basePICTid, numPICTs, maxPICTWidth, maxPICTHeight;
-
- GetNumPICTs( menu, &basePICTid, &numPICTs );
- CalcitemHeightAndWidth( basePICTid, numPICTs, &maxPICTWidth, &maxPICTHeight );
-
- (**menu).menuWidth = maxPICTWidth + 2 * kLeftMargin;
- (**menu).menuHeight = (maxPICTHeight + kTopMargin * 2) * numPICTs;
- }
-
-
- /*********************************** DoDrawMessage */
-
- void DoDrawMessage( MenuHandle menu,
- Rect *menuRectPtr )
- {
- short basePICTid, numPICTs, maxPICTWidth, maxPICTHeight, itemHeight, i;
- Rect r, tempRect;
- PicHandle pic;
-
- GetNumPICTs( menu, &basePICTid, &numPICTs );
- CalcitemHeightAndWidth( basePICTid, numPICTs, &maxPICTWidth, &maxPICTHeight );
-
- itemHeight = maxPICTHeight + kTopMargin * 2;
-
- r.top = menuRectPtr->top + kTopMargin;
- r.left = menuRectPtr->left + kLeftMargin;
- r.bottom = r.top + maxPICTHeight;
- r.right = r.left + maxPICTWidth;
-
- for ( i=0; i<numPICTs; i++ )
- {
- pic = GetPicture( basePICTid + i );
-
- DrawCenteredPict( pic, &r );
-
- OffsetRect( &r, 0, itemHeight );
- }
- }
-
-
- /*********************************** DoChooseMessage */
-
- void DoChooseMessage( MenuHandle menu,
- Rect *menuRectPtr,
- Point hitPt,
- short *whichItemPtr )
- {
- short basePICTid, selectedItem, numPICTs, maxPICTWidth, maxPICTHeight, itemHeight;
- Rect r;
-
- GetNumPICTs( menu, &basePICTid, &numPICTs );
- CalcitemHeightAndWidth( basePICTid, numPICTs, &maxPICTWidth, &maxPICTHeight );
-
- itemHeight = (2 * kTopMargin) + maxPICTHeight;
-
- if ( PtInRect( hitPt, menuRectPtr ) )
- {
- selectedItem = ( (hitPt.v - menuRectPtr->top) / itemHeight ) + 1;
-
- if ( ( *whichItemPtr > 0 ) && ( *whichItemPtr != selectedItem ) )
- {
- InvertItem( *whichItemPtr, itemHeight, menuRectPtr );
- }
-
- if ( *whichItemPtr != selectedItem )
- {
- *whichItemPtr = selectedItem;
- InvertItem( *whichItemPtr, itemHeight, menuRectPtr );
- }
- }
- else if ( *whichItemPtr > 0 )
- {
- InvertItem( *whichItemPtr, itemHeight, menuRectPtr );
- *whichItemPtr = 0;
- }
- }
-
-
- /*********************************** InvertItem */
-
- void InvertItem( short itemNumber,
- short itemHeight,
- Rect *menuRectPtr )
- {
- Rect r;
-
- r = *menuRectPtr;
-
- r.top += ( (itemNumber-1) * itemHeight );
- r.bottom = r.top + itemHeight;
-
- InvertRect( &r );
- }
-
-
- /*********************************** DrawCenteredPict */
-
- void DrawCenteredPict( PicHandle pic,
- Rect *rectPtr )
- {
- Rect pictRect;
-
- pictRect = (**pic).picFrame;
-
- OffsetRect( &pictRect, rectPtr->left - pictRect.left,
- rectPtr->top - pictRect.top);
- OffsetRect( &pictRect,(rectPtr->right - pictRect.right)/2,
- (rectPtr->bottom - pictRect.bottom)/2);
-
- DrawPicture( pic, &pictRect );
- }
-
-
- /*********************************** CalcitemHeightAndWidth */
-
- void CalcitemHeightAndWidth( short basePICTid,
- short numPICTs,
- short *widthPtr,
- short *heightPtr )
- {
- short i;
- Rect r;
- PicHandle pic;
-
- *widthPtr = 0;
- *heightPtr = 0;
-
- for ( i=0; i<numPICTs; i++ )
- {
- pic = GetPicture( basePICTid + i );
- r = (**pic).picFrame;
-
- if ( r.bottom - r.top > *heightPtr )
- *heightPtr = r.bottom - r.top;
-
- if ( r.right - r.left > *widthPtr )
- *widthPtr = r.right - r.left;
- }
- }
-
-
- /*********************************** GetNumPICTs */
-
- void GetNumPICTs( MenuHandle menu,
- short *baseIDPtr,
- short *numPICTsPtr )
- {
- Handle longHandle;
- long retrievedLong;
- short menuID;
-
- menuID = (**menu).menuID;
-
- longHandle = GetResource( 'long', menuID );
-
- retrievedLong = (*((long *)(*longHandle)));
-
- *baseIDPtr = HiWord( retrievedLong );
- *numPICTsPtr = LoWord( retrievedLong );
- }